package com.common.utils;

import com.common.constants.NumberConstantPool;
import com.common.pojo.vo.PageVO;

import java.util.ArrayList;
import java.util.List;

/**
 * @Brief 后端分页数据类生成工具
 * @Author chenyl
 * @Date 2021-12-07
 * @Version 1.0.0
 */
public class PageUtil {
    /**
     * 由于mybatis-plus自带的page对象返回到前端不是很友好，所以自定义分页返回对象
     *
     * @param curPage  当前页码
     * @param pageSize 每条条数
     * @param <T>      对应的实体类
     * @return PageVO对象
     */
    public static <T> PageVO<T> createPage(int curPage, int pageSize) {
        return createPage((long) NumberConstantPool.ZERO, curPage, pageSize, new ArrayList<>());
    }

    /**
     * 由于mybatis-plus自带的page对象返回到前端不是很友好，所以自定义分页返回对象
     *
     * @param totalCount 总条数
     * @param curPage    当前页码
     * @param pageSize   每条条数
     * @param data       数据结果集
     * @param <T>        对应的实体类
     * @return PageVO对象
     */
    public static <T> PageVO<T> createPage(Long totalCount, int curPage, int pageSize, List<T> data) {
        // 初始化返回对象
        PageVO<T> vo = new PageVO<>(totalCount, Math.max(curPage, NumberConstantPool.ONE), pageSize, data);
        // 计算并设置总页数
        vo.setTotalPage((long) Math.ceil((double) totalCount / (double) pageSize));
        return vo;
    }

    /**
     * 更新分页对象数据
     *
     * @param vo         原始对象
     * @param totalCount 数据总条数
     * @param data       要返回的数据集合
     * @param <T>        对应的实体类
     */
    public static <T> void refreshData(PageVO<T> vo, Long totalCount, List<T> data) {
        // 设置总条数
        vo.setTotalPage(totalCount);
        // 设置返回的数据集合
        vo.setData(data);
        // 计算并设置总页数
        vo.setTotalPage((long) Math.ceil((double) totalCount / (double) vo.getPageSize()));
    }
}
